import axios from '../api/axios'
// import ins from '../../../main'

const common = {
  /**
   *解决cardFrom表单组件中发送请求并回调赋值的操作
   * @param json:{
   * url:请求地址
   * target：[数组源数据,需要赋值的那条数据name值]
   * callback()：回调函数，返回getSelCurr匹配到的数组源数据中那条数据
   * }
   */
  getOptions(json) {
    if (json.url) {
      axios({
        method: 'post',
        api: process.env.VUE_APP_BASE_API + json.url,
        para: json.data || {}
      }).then(res => {
        const async = this.getSelCurr(json.target())
        json.callback && json.callback(res, async)
      }).catch(() => {
        json.callback && json.callback()
      })
    } else {
      this.nextTick(() => {
        const async = this.getSelCurr(json.target())
        json.callback && json.callback(async)
      })
    }
  },
  getSelCurr(arr) {
    const [formData, objKey] = [...arr]
    return formData.find(item => item.name === objKey)
  },
  /**
   *通用表单验证方法
   * @param _this: 改变当前this指向 （必传，不然没有提示）
   * @param rulesObj: 需要验证的字段（参考elementUI里面的form表单验证）
   * rules: {
      name: [
        { required: true, message: '名称为必填项,请填写!' },
      ],
      number: [
        { required: true, message: 'number为必填项,请填写!' },
        { type: 'number', min: 1, max: 5, message: '请输入1到5之间的数值' },
      ],
    },
   * @param form: 表单
   */
  formValidate(_this, rulesObj, form) {
    const { tip } = _this.$root
    let results = true // 控制抛出的结果
    for (const [k, rules] of Object.entries(rulesObj)) {
      const formValue = form[k] // 表单字段的值
      // 字符串格式时
      if (form[k] !== undefined) {
        for (const item of rules) {
          if ((formValue === '' || formValue === null) && item.required) {
            // 验证必填,默认出现在rules对象中的字段都为必填项
            results = false
            tip(item.message, 'error')
            return results
          }
          // 数值为number的情况，可以传入min和max来控制大小提示
          if (Object.prototype.toString.call(parseFloat(formValue)) === '[object Number]' && item.type === 'number') {
            if (item.min || item.max) {
              if (parseFloat(formValue) < item.min || parseFloat(formValue) > item.max) {
                results = false
                tip(item.message, 'error')
                return results
              }
            }
          }
        }
      } else {
        for (const item of rules) {
          results = false
          tip(item.message, 'error')
          return results
        }
      }
      // 数值是数组格式时
      if (Object.prototype.toString.call(formValue) === '[object Array]') {
        for (const item of rules) {
          if (!formValue.length && item.required) {
            // 验证必填,默认出现在rules对象中的字段都为必填项
            results = false
            tip(item.message, 'error')
            return results
          }
        }
      }
    }
    return results
  },
  /**
   * js 文本复制
   * @param value 需复制的值
   */
  copy(value) {
    const currentFocus = document.activeElement // 保存当前活动节点
    const input = document.createElement('input') // 创建一个input标签
    document.body.appendChild(input) // 把标签添加给body
    input.style.opacity = 0 // 设置input标签设置为透明(不可见)
    input.value = value // 把需要复制的值放到input上
    // 记录当前滚动位置, 因为添加节点并选中的时候会影响页面滚动
    const scrollY = window.scrollY
    input.focus() // input节点获取焦点
    input.setSelectionRange(0, input.value.length) // 选中input框中的所有文字
    const res = document.execCommand('copy', true) // 复制文字并获取结果
    if (res) {
      currentFocus.focus() // 之前活动节点获得焦点
      document.body.removeChild(input) // 删除添加的input节点
      // 页面滚动到之前位置
      window.scrollTo(0, scrollY)
      return res // 返回操作结果
    } else {
      // ins.$root.tip('无法自动复制,需自行手动复制!')
    }
  },
  /**
   * 深拷贝
   */
  deepCopy(obj) {
    const result = Array.isArray(obj) ? [] : {}
    for (const key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        if (typeof obj[key] === 'object' && obj[key] !== null) {
          result[key] = this.deepCopy(obj[key]) // 递归复制
        } else {
          result[key] = obj[key]
        }
      }
    }
    return result
  },
  
  /**
   * null -> ''
   */
   null2str(data) {
    for (let x in data) {
      if (data[x] === null) { // 如果是null 把直接内容转为 ''
        data[x] = '';
      } else {
        if (Array.isArray(data[x])) { // 是数组遍历数组 递归继续处理
          data[x] = data[x].map(z => {
            return common.null2str(z);
          });
        }
        if(typeof(data[x]) === 'object'){ // 是json 递归继续处理
          data[x] = common.null2str(data[x])
        }
      }
    }
    return data;
  },
  // 根据身份证号获取年龄  生日 性别
  getAgeBirthSexByID(idCard) {
    if (![15, 18].includes(idCard.length)) {
      return
    }
    let birthDay = '',age = '', sex = ''
    // 获取出生年月
    if (idCard.length === 15) {
      birthDay = ['19' + idCard.substr(6, 2), idCard.substr(8, 2), idCard.substr(10, 2)].join('-')
    } else if (idCard.length === 18) {
      birthDay = [idCard.substr(6, 4), idCard.substr(10, 2), idCard.substr(12, 2)].join('-')
    }
    // 获取性别 0女  1男
    if (idCard.length === 15) {
      sex = [0, 1][idCard.substr(14, 1) % 2]
    } else if (idCard.length === 18) {
      sex = [0, 1][idCard.substr(16, 1) % 2]
    }

    // 获取年龄
    const yearBirth = idCard.substring(6, 10)
    const monthBirth = idCard.substring(10, 12)
    const dayBirth = idCard.substring(12, 14)
    // 获取当前年月日并计算年龄
    const myDate = new Date()
    const monthNow = myDate.getMonth() + 1
    const dayNow = myDate.getDate()
    age = myDate.getFullYear() - yearBirth
    if (monthNow < monthBirth || (monthNow == monthBirth && dayNow < dayBirth)) {
      age--
    }
    return { birthDay, age, sex }
  },
}
export default common
